package cn.lbd.arithmetic.leetcode.editor.cn;
//给你一个整数数组 arr，请你帮忙统计数组中每个数的出现次数。
//
// 如果每个数的出现次数都是独一无二的，就返回 true；否则返回 false。 
//
// 
//
// 示例 1： 
//
// 输入：arr = [1,2,2,1,1,3]
//输出：true
//解释：在该数组中，1 出现了 3 次，2 出现了 2 次，3 只出现了 1 次。没有两个数的出现次数相同。 
//
// 示例 2： 
//
// 输入：arr = [1,2]
//输出：false
// 
//
// 示例 3： 
//
// 输入：arr = [-3,0,1,-3,1,1,1,-3,10,0]
//输出：true
// 
//
// 
//
// 提示： 
//
// 
// 1 <= arr.length <= 1000 
// -1000 <= arr[i] <= 1000 
// 
// Related Topics 哈希表 
// 👍 74 👎 0


import java.util.*;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution1207 {
    public static boolean uniqueOccurrences(int[] arr) {
        //k: 数组元素  v：出现次数
        Map<Integer, Integer> counts = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
            if (!counts.containsKey(arr[i])) {
                counts.put(arr[i], 1);
            } else {
                counts.put(arr[i], counts.get(arr[i]) + 1);
            }
        }
        Set<Integer> numKey = counts.keySet();
        //map中有几个Key <=> 几个Value
        int count = numKey.size();
        Set<Integer> set = new HashSet<>();
        for (Integer integer : numKey) {
            set.add(counts.get(integer));
        }
        //将Map的value加入到一个新的Set中，通过判断是否与count相等，来间接的判断是否有重复元素
        //根据Set特性，重复元素不予以添加
        //也就是说，如果重复了，这个Set的长度必然小于count，不重复就等于count
        if (set.size() != count) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{3, 5, -2, -3, -6, -6};
        System.out.println(uniqueOccurrences(arr));
    }
}
//leetcode submit region end(Prohibit modification and deletion)
